void getmin(struct TreeNode* root, int* min)
{
    if (root == NULL)
        return;

    if (root->val < *min)
    {
        *min = root->val;
    }

    getmin(root->left, min);
    getmin(root->right, min);
}

void getmax(struct TreeNode* root, int* min)
{
    if (root == NULL)
        return;

    if (root->val >= *min)
    {
        *min = root->val;
    }

    getmax(root->left, min);
    getmax(root->right, min);
}

void getmin2(struct TreeNode* root, int min1, int* min2)
{
    if (root == NULL)
        return;
    if (root->val <= *min2 && root->val != min1)
    {
        *min2 = root->val;
    }
    getmin2(root->left, min1, min2);
    getmin2(root->right, min1, min2);
}

int findSecondMinimumValue(struct TreeNode* root) {
    int max = 1;
    getmax(root, &max);
    int min1 = max;
    getmin(root, &min1);
    int min2 = max;
    getmin2(root, min1, &min2);
    if (max == min1)
        return -1;

    return min2;
}